package org.jederik.studip.android.view;

import org.jederik.studip.android.Const;
import org.jederik.studip.android.R;
import org.jederik.studip.android.sync.CheckChangesService;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.util.Log;

/**
 * In dieser Activity kann der Nutzer Einstellungen vornehmen.
 * @author Jann-Frederik Laß
 *
 */
public class Preferences extends PreferenceActivity {
	
	/** Property-Schlüssel, um abzufragen, ob der Stundenplan importiert werden soll */
	public static final String IMPORT_SCHEDULE = "import_schedule";
	
	/** Property-Schlüssel, um abzufragen, in welchen Kalender der Stundenplan importiert werden soll */
	public static final String SELECT_CALENDAR = "select_calendar";
	
	/** Property-Schlüssel, um abzufragen, wann zum letzten Mal der Stundenplan synchronisiert wurde */
	public static final String LAST_SCHEDULE_SYNC = "last_schedule_sync";
	
	/** Property-Schlüssel, um abzufragen, wann zum letzten Mal die bereits geöffneten Resourcen synchronisiert wurden */
	public static final String LAST_VISITED_OBJECTS_SYNC = "last_visited_objects_sync";
	
	/** Property-Schlüssel, um abzufragen, wann zum letzten Mal der Feed synchronisiert wurde */
	public static final String LAST_FEED_SYNC = "last_feed_sync";

	/** Property-Schlüssel, um abzufragen, wann zum letzten Mal der Feed angesehen wurde */
	public static final String LAST_FEED_VIEW = "last_feed_view";
	
	/** Property-Schlüssel, um abzufragen, ob regelmäßig synchronisiert werden soll */
	public static final String CHECK_CHANGES = "check_changes";
	
	/** Property-Schlüssel, um abzufragen, wie oft synchronisiert werden soll */
	public static final String UPDATE_FREQUENCY = "update_frequency";
	
	/** Property-Schlüssel, um abzufragen, wie weit zurückreichende Feedeinträge angezeigt werden sollen */
	public static final String FEED_TIMESPAN = "feed_timespan";
	
	
	private static final Uri CALENDARS_CONTENT_URI = Uri.parse("content://calendar/calendars");
	private static final String TAG = "Preferences";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.addPreferencesFromResource(R.xml.preferences);
		
		// Falls der Nutzer die Zeitspanne für die Feed-Einträge geladen werden
		// sollen vergrößert, muss bei der nächsten Synchronisation wieder
		// von Beginn der Zeitspanne an geladen werden anstatt nur seit der
		// letzten Synchronisation. Dazu wird last_feed_sync in diesem Fall
		// zurückgesetzt:
		
		// timespan-Preference erhalten:
		Preference feedTimespan = findPreference(FEED_TIMESPAN);
		
		// und mit ChangeListener versehen:
		feedTimespan.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
			
			@Override
			public boolean onPreferenceChange(Preference pref, Object newValue) {
				
				// Überprüfen, ob die Zeitspanne vergrößert oder verkleinert wurde:
				int newTimespan = Integer.parseInt((String) newValue);
				int oldTimespan = Integer.parseInt(
						Preferences.getPreferences(Preferences.this)
						.getString(Preferences.FEED_TIMESPAN, "604800")
					);
				if (newTimespan > oldTimespan) {

					// Falls vergrößert last_feed_sync zurücksetzen:
					SharedPreferences.Editor editor = 
						getSharedPreferences(Const.PREFS_NAME, 0).edit();
					editor.remove(LAST_FEED_SYNC);
					editor.commit();
				}
				
				return true;
			}
		});
		
		
		// Falls der Nutzer die automatische Benachrichtigung aktiviert/deaktiviert
		// muss der CheckChangesService gestartet/gestoppt werden:
		
		Preference checkChanges = findPreference(CHECK_CHANGES);
		checkChanges.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
			
			@Override
			public boolean onPreferenceChange(Preference pref, Object newValue) {
				
				// Alten und neuen Wert vergleichen:
				boolean newCheckChanges = (Boolean) newValue;
				boolean oldCheckChanges = Preferences
				.getPreferences(Preferences.this)
				.getBoolean(CHECK_CHANGES, false);

				// Falls Wert geändert wurde:
				if (oldCheckChanges ^ newCheckChanges ) {
					
					// CheckChangesService...
					Intent i = new Intent(
							getApplicationContext(),
							CheckChangesService.class);

					// ... entweder starten oder stoppen:
					if (newCheckChanges) startService(i);
					else stopService(i);
				}

				return true;
			}
		});
		
		loadCalendars();
	}
	
	/*
	 * Hier wird der Eintrag "Kalender wählen" initialisiert. Die Liste der
	 * auf dem Gerät vorhandenen Kalender wird vom ContentProvider abgerufen
	 * und in der Auswahlliste angezeigt.
	 */
	private void loadCalendars() {
		
		Log.d(TAG, "Loading Calendars...");
		
		// Vorhandene Kalender vom ContentProvider abrufen:
		Cursor calendars = getContentResolver().query(CALENDARS_CONTENT_URI, null, null, null, null);
		
		// Spaltenindizes zwischenspeichern:
		final int IDX_DISPLAY_NAME = calendars.getColumnIndex("displayName");
		final int IDX_NAME = calendars.getColumnIndex("name");
		final int IDX_ID = calendars.getColumnIndex("_id");
		
		// Array, dessen Einträge in der Liste angezeigt werden:
		String[] entries = new String[calendars.getCount()];
		// Array, in dem die Kalender-IDs gespeichert werden:
		String[] values = new String[calendars.getCount()];
		
		// Kalender werden durchlaufen und die Werte in den Arrays gespeichert:
		int i = 0;
		while (calendars.moveToNext()) {
			
			// Falls die Spalte "displayName" nicht existiert wird "name" angezeigt:
			if (calendars.isNull(IDX_DISPLAY_NAME))
				entries[i] = calendars.getString(IDX_NAME);
			else
				entries[i] = calendars.getString(IDX_DISPLAY_NAME);
			
			// ID auslesen:
			values[i] = calendars.getString(IDX_ID);
			
			// Index um 1 erhöhen:
			i++;
		}
		
		// Die Einträge werden der Preference übergeben:
		ListPreference selectCalendar = (ListPreference) findPreference(SELECT_CALENDAR);
		selectCalendar.setEntries(entries);
		selectCalendar.setEntryValues(values);
	}
	
	/**
	 * Hilfsmethode, die einen Android-Bug umgeht. Liefert Zugriff auf
	 * die SharedPreferences der Anwendung.
	 * @param ctx
	 * @return
	 */
	public static final SharedPreferences getPreferences(Context ctx) {
		return ctx.getSharedPreferences(
				ctx.getPackageName() + "_preferences", 0);
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		
		// Falls vom Nutzer so eingestellt, wird der Hintergrundservice gestartet
		boolean checkChanges = Preferences
									.getPreferences(this)
									.getBoolean(CHECK_CHANGES, false);
		Intent i = new Intent(
				getApplicationContext(),
				CheckChangesService.class);
		if (checkChanges) startService(i);
		else stopService(i);
		
	}
}
